package com.gy.hsim.bservice.framework.redis;


import java.io.Serializable;
import java.util.HashMap;
import java.util.ResourceBundle;
import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


/**
 * 采用redis对所有消息进行持久化
 * 1. redis 0 数据库直接将消息持久化不做任何处理
 * 2. redis 1 数据库按set数据结构存储 key: fromUID+toUID（出去前面的w和m）
 * 3. redis 2 数据库采用综合数据存储方式，key: CYCHAT:fromID:value --->ID 通过ID获取详细信息
 *    等同于数据库 ID fromID toUid message datetime
 *   
 * @author David
 *
 */
public class JRedisPersistentMessage implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
		private static JedisPool  pool  = null;
	    private static String key = null; //存储消息的key名字，类似表名
	    private static String redisPwd =null;
			/**
			 * 静态块，加载配置文件进行赋值
			 */
		static{
			
			ResourceBundle bundle = ResourceBundle.getBundle("redis");  
		    if (bundle == null) {  
		        throw new IllegalArgumentException(  
		                "[redis.properties] is not found!");  
		    }
		    key = bundle.getString("redis.chat.key").trim();
		    JedisPoolConfig config = new JedisPoolConfig();  
		    config.setMaxActive(Integer.valueOf(bundle  
		            .getString("redis.pool.maxActive").trim()));  
		    config.setMaxIdle(Integer.valueOf(bundle  
		            .getString("redis.pool.maxIdle").trim()));  
		    config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait").trim()));  
		    config.setTestOnBorrow(Boolean.valueOf(bundle  
		            .getString("redis.pool.testOnBorrow").trim()));  
		    config.setTestOnReturn(Boolean.valueOf(bundle  
		            .getString("redis.pool.testOnReturn").trim())); 
		   
		     pool = new JedisPool(config, 
						bundle.getString("redis.ip").trim(), 
						Integer.valueOf(bundle.getString("redis.port").trim()),5000,redisPwd);
		   
	}
		

	/**
	 * 
	 * @param message 聊天消息是json串
	 * JSON串中的ID就是version的值用来标记聊天的时间点
	 * 数据库为0 (select(0))
	 */
	public void saveMessage(String message){
		
		Jedis jedis = null;
	   try{
		 
			jedis = pool.getResource();
			jedis.select(0);
			//采用Redis的list集合保存
			jedis.lpush(key,message);	
			//采用redis的set集合保存
			fromToAsKeySaveMessage(message);
			//综合采用数据模型存储
			fromToAsKeySaveMessage(message,key);
			
		}catch(Exception e){
			e.printStackTrace();
		
		}finally{
			if(jedis != null){
				pool.returnResource(jedis);
			}
		
		}
	
		
	}
	
	/**
	 * 以fromUID+"To"+ToUID为key（1数据库 select(1)）。
	 *  之后客户端想将fromUID和ToUID的消息就可以传fromUID+"To"+ToUID获取他们之间所有的消息
	 * @param message
	 */
	public static void fromToAsKeySaveMessage(String message){
		Jedis jedis = null;
		   try{
				jedis = pool.getResource();
				JSONObject json = JSONObject.parseObject(message);
				String fromUID = json.getString("fromUid");
				String ToUID   = json.getString("toUid");
				String datetime = json.getString("dateTime");
				String fromKey = null;
				if(fromUID.startsWith("w") || fromUID.startsWith("m")){
					fromKey = fromUID.substring(1,fromUID.length())+"To"+ToUID.substring(1,ToUID.length());
				}else{
					fromKey = fromUID+"To"+ToUID;
				}
				if(jedis.exists(fromKey)){
					jedis.select(1); //1数据库
					jedis.lpush(fromKey, fromUID,datetime,ToUID,message);
				}else{
					//Jedis set集合处理
					jedis.select(1);
					jedis.sadd(fromKey, fromUID,datetime,ToUID,message);
				}
				
			}catch(Exception e){
				e.printStackTrace();
			
			}finally{
				if(jedis != null){
					pool.returnResource(jedis);
				}
			
			}
	}
	
	/**
	 * 1.lrange GYCHAT:fromUID:m_e_06186000000_0000 找ID（1,2）
	 * 
	 * 2.hmget GYCHAT:1 fromUID toUID message datatime 获取ID的值
	 *   hmget GYCHAT:2 fromUID toUID message datatime
	 *   
	 * 3.使用2数据库来存储这个数据模型
	 *   ID, fromUID, toUID message, datetime
	 *   key: fromUID
	 *   
	 * @param message
	 * @param key
	 */
	public static void fromToAsKeySaveMessage(String message,String key){
		
		HashMap<String, String> hmes = new HashMap<String, String>();
		JSONObject json = JSONObject.parseObject(message);
		String fromUID = json.getString("fromUid");
		String toUID   = json.getString("toUid");
		String mes = json.getString("message");
		String datetime = json.getString("dateTime");
		hmes.put("fromUID", fromUID);
		hmes.put("toUID", toUID);
		hmes.put("message", mes);
		hmes.put("datetime", datetime);
		
		Jedis jedis = pool.getResource();
		try{
			jedis.select(2); //2 数据库
			Long i = jedis.incr(key+":id");
		    jedis.hmset(key+":"+i, hmes);
		    jedis.lpush(key+":fromUID:"+fromUID, i.toString());
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			pool.returnResource(jedis);
		}
		
	
 }

}
